package com.eyas.im.server;

import com.eyas.im.protocol.protocol.Protocol;

import java.io.IOException;
import java.net.SocketAddress;

/**
 * 事件处理器，与selectionKey绑定，随着selectionKey的回收而死亡
 *
 * @param <T>:协议类型
 */
public interface ServerSocketHandler<T extends Protocol<?>> {
    /**
     * read的byteBuffer通过Decoder解析后，触发该方法
     * 注意：这个方法会阻塞IOEvent Thread运行，不要长时间阻塞
     * @param decodeData 解析后的数据
     */
    void afterDecodeData(T decodeData);
    /**
     * 写数据
     * @param sendData 要发送的数据
     * @param callbackFunction sendData发送成功后的回调方法，当NIO模式下时，可以异步执行回调，BIO时，在write成功后也会自动调用
     * @return 调用Future.get方法来实现等待数据完全发送完
     * @throws IOException
     */
    TaskCompleteFuture write(T sendData,WriteCallbackFunction callbackFunction) throws IOException;

    /**
     * 发送数据，write之后必须显示调用这个方法
     */
    void flush();

    /**
     * 连接获取后
     * @param socketAddress 客户端的连接信息
     */
    void afterAccept(SocketAddress socketAddress);

    /**
     * 连接关闭前触发
     */
    void beforeClose();

    /**
     * 关闭通信
     */
    void shutdown() throws IOException;
}
